#!/bin/bash

# 代码格式化脚本
# 用法: ./scripts/format.sh [options]

set -e  # 遇到错误立即退出

# 默认参数
CHECK_ONLY=false
FIX=false

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 打印帮助信息
print_help() {
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  --check       只检查格式，不修改文件"
    echo "  --fix         自动修复格式问题（默认）"
    echo "  -h, --help    显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 --check"
    echo "  $0 --fix"
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        --check)
            CHECK_ONLY=true
            shift
            ;;
        --fix)
            FIX=true
            shift
            ;;
        -h|--help)
            print_help
            exit 0
            ;;
        *)
            echo -e "${RED}错误: 未知参数 '$1'${NC}"
            print_help
            exit 1
            ;;
    esac
done

# 如果没有指定参数，默认为fix
if [ "$CHECK_ONLY" = false ] && [ "$FIX" = false ]; then
    FIX=true
fi

# 获取脚本所在目录的父目录（项目根目录）
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"

cd "$PROJECT_DIR"

echo -e "${GREEN}=== C++ 代码格式化脚本 ===${NC}"
echo "项目目录: $PROJECT_DIR"
echo ""

# 检查clang-format是否安装
if ! command -v clang-format &> /dev/null; then
    echo -e "${RED}错误: clang-format 未安装${NC}"
    echo "请安装 clang-format:"
    echo "  Ubuntu/Debian: sudo apt-get install clang-format"
    echo "  macOS: brew install clang-format"
    echo "  Fedora: sudo dnf install clang-tools-extra"
    exit 1
fi

# 显示clang-format版本
echo "clang-format 版本: $(clang-format --version)"
echo ""

# 查找所有需要格式化的文件
SOURCES=$(find src include tests -type f \( -name "*.cpp" -o -name "*.hpp" -o -name "*.h" -o -name "*.cc" -o -name "*.cxx" \) 2>/dev/null || true)

if [ -z "$SOURCES" ]; then
    echo -e "${YELLOW}警告: 未找到需要格式化的源文件${NC}"
    exit 0
fi

# 计算文件数量
FILE_COUNT=$(echo "$SOURCES" | wc -l)
echo "找到 $FILE_COUNT 个源文件"
echo ""

if [ "$CHECK_ONLY" = true ]; then
    echo -e "${GREEN}检查代码格式...${NC}"
    
    # 检查格式
    ISSUES=0
    while IFS= read -r file; do
        if ! clang-format --dry-run --Werror "$file" 2>/dev/null; then
            echo -e "${YELLOW}格式问题: $file${NC}"
            ((ISSUES++))
        fi
    done <<< "$SOURCES"
    
    if [ $ISSUES -eq 0 ]; then
        echo -e "${GREEN}所有文件格式正确！${NC}"
        exit 0
    else
        echo -e "${RED}发现 $ISSUES 个文件存在格式问题${NC}"
        echo -e "${YELLOW}运行 '$0 --fix' 来自动修复${NC}"
        exit 1
    fi
else
    echo -e "${GREEN}格式化代码...${NC}"
    
    # 格式化所有文件
    while IFS= read -r file; do
        echo "格式化: $file"
        clang-format -i "$file"
    done <<< "$SOURCES"
    
    echo -e "${GREEN}代码格式化完成！${NC}"
    exit 0
fi
